package io.renren.common.utils;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class IdCardUtil {

    private static String host = "https://zidv2.market.alicloudapi.com";
    private static String path = "/idcard/VerifyIdcardv2";
    private static String appcode = "1eedd702484b4835a7e9c06a4283f07d";



    /**
     * 通过阿里平台验证身份证信息是否正确,姓名和身份证号是否匹配
     * @param idCard
     * @param userName
     * @return
     */
    public static Map<String, Object> aliyunIdCardVerification(String idCard, String userName){
        String method = "GET";
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "APPCODE " + appcode);
        Map<String, String> querys = new HashMap<>();
        querys.put("cardNo", idCard);
        querys.put("realName", userName);
        Map<String, Object> map = new HashMap<>();
        try {
            HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
            System.out.println(response.toString());
            JSONObject jsonObject = JSONUtil.parseObj(EntityUtils.toString(response.getEntity()));
            System.out.println(jsonObject.toString());
            if (jsonObject.getInt("error_code")==0){
                jsonObject = (JSONObject) jsonObject.get("result");
                if(jsonObject.getBool("isok")) {
                    map.put("code", 200);
                    map.put("message", "验证身份一致性通过");
                }else {
                    map.put("code", 400);
                    map.put("message", "身份证号码与姓名验证不一致");
                }
            } else {
                map.put("code", 400);
                map.put("message", "身份证号码与姓名验证不一致");
            }
        } catch (Exception e) {
            e.printStackTrace();
            map.put("code",500);
            map.put("message","验证身份一致性方法异常");
        }
        return map;
    }

    /**
     * 护照验证
     * 规则： G + 8位数字, P + 7位数字, S/D + 7或8位数字,等
     * 例： G12345678, P1234567
     */
    public static Boolean passportCard(String card) {
        String reg = "^([a-zA-z]|[0-9]){5,17}$";
        if (card.matches(reg) == false) {
            //护照号码不合格
            return  false;
        } else {
            //校验通过
            return true;
        }
    }
    /**
     * 台湾居民来往大陆通行证
     * 规则： 新版8位  （或18位数字 或 旧版9位数字 + 英文字母 或 8位数字 + 英文字母）
     * 样本： 12345678
     */
    public static Boolean isTWCard(String card) {
        //String reg = "^\\d{8}|^[a-zA-Z0-9]{10}|^[a-zA-Z0-9]{9}|^\\d{18}$";
        //规则：8位数字校验
        String reg = "^[0-9]{8}$";
        if (card.matches(reg) == false) {
            //台湾居民来往大陆通行证号码不合格
            return false;
        } else {
            //校验通过
            return true;
        }
    }
    /**
     * 港澳居民来往内地通行证
     * 规则： H/M + 10位数字   字母+前8位数字校验唯一性
     * 例：H1234567890
     */
    public static Boolean isHKCard(String card) {
        String reg = "^([HMhm]\\d{6,10}(\\(\\w{1}\\))?)$";
        //规则： H/M + 10位或6位数字
        //String reg = "^[HMhm]{1}([0-9]{10}|[0-9]{6})$";
        if (card.matches(reg) == false) {
            //港澳居民来往内地通行证号码不合格
            return false;
        } else {
            //校验通过
            return true;
        }
    }

    /**
     * 验证身份证是否满16周岁
     * @param idCard
     * @return
     */
    public static boolean isAdult(String idCard) {
        //获取系统当前时间年份
        long now = Long.parseLong(DateUtils.getYear());
        //获取身份证上的出生日期
        String birth = idCard.substring(6, 10);
        //将出生日期转换为时间戳
        long birthTime = Long.parseLong(birth);
        //计算年龄
        long age = now - birthTime;
        //判断是否满16周岁
        if (age >= 16) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取身份号里的年份
     * @param
     */
    public static String getYear(String idCard) {
        return idCard.substring(6, 10);
    }

    /**
     * 获取身份号里的月份
     * @param
     */
    public static String getMonth(String idCard) {
        return idCard.substring(10, 12);
    }

    public static void main(String[] args) {
        //System.out.println(passportCard("G12345678"));
        //System.out.println(isTWCard("12345678"));
        //System.out.println(isHKCard("M1055242"));
        System.out.println(isAdult("230104201012256615"));
    }

    /*public static void main(String[] args){
        //邢煜杨  230104201012256615
        Map<String, Object> result = IdCardUtil.aliyunIdCardVerification("230104201012256615","郉煜杨");
        System.out.println(result.get("message"));
    }*/


}
